function isObject(obj) {
  return typeof obj === "object" && obj != null;
}

function isEqual(obj1, obj2) {
  // 1.首先判断是不是基础类型 或 null
  if (!isObject(obj1) || !isObject(obj2)) {
    return obj1 === obj2;
  }
  //   1.1 判断是不是 自己和自己对比
  if (obj1 === obj2) {
    return true;
  }
  // 2.如果不是基础类型 那就是 对象 或者数组了
  // 3.判断对象的键或者数组的长度 是不是一样的
  const obj1KeyList = Object.keys(obj1);
  const obj2KeyList = Object.keys(obj2);
  if (obj1KeyList.length !== obj2KeyList.length) {
    return false;
  }
  // 4.如果是一样的。判断所有键的其值 是不是一样的
  for (let i in obj1) {
    const res = isEqual(obj1[i], obj2[i]);
    if (!res) {
      return false;
    }
  }
  // 5.满足上述所有条件 返回 true 否则一律返回 false
  return true;
}

const obj1 = {
  a: 100,
  b: {
    c: 200,
    d: [1, 2, 3],
  },
  e: [2, 3, 4],
};

const obj2 = {
  a: 100,
  b: {
    c: 200,
    d: [1, 2, 3],
  },
  e: [2, 3, 4],
};

console.log(isEqual(obj1, obj2));
console.log(isEqual(obj1, obj1));
